//package com.kun.companion.core.queue.thread;
//
//import com.kun.companion.core.AbstractApplication;
//import com.kun.companion.core.queue.ButtonEvent;
//import com.kun.companion.core.queue.QueueConfig;
//import com.kun.companion.core.thread.PrioritizedTask;
//import com.kun.companion.core.thread.PriorityFutureTask;
//import com.kun.companion.core.thread.PriorityThreadPoolExecutor;
//import com.kun.companion.core.util.ComUtil;
//import javafx.scene.control.Label;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//
//import java.util.Comparator;
//import java.util.concurrent.*;
//
///**
// * 优先级任务执行器
// *
// * <p>核心功能：
// * <ul>
// *   <li>基于优先级的线程池任务调度</li>
// *   <li>自动重试机制（带指数退避策略）</li>
// *   <li>失败回调与成功回调处理</li>
// *   <li>任务状态监控（队列大小、活跃线程数）</li>
// * </ul>
// *
// * <p>设计特点：
// * <ul>
// *   <li>使用优先级阻塞队列保证高优先级任务优先执行</li>
// *   <li>独立的重试调度器避免影响主线程池</li>
// *   <li>线程安全的UI回调机制（通过Platform.runLater）</li>
// * </ul>
// *
// * @author gzc
// * @since 2025/2/3
// */
//public class TaskExecutor {
//    private static final Logger log = LoggerFactory.getLogger(TaskExecutor.class);
//
//    /**
//     * 主执行器（带优先级）
//     */
//    private final PriorityThreadPoolExecutor executor;
//    /**
//     * 独立的重试调度器（避免阻塞主线程池）
//     */
//    private final ScheduledExecutorService retryScheduler;
//    /**
//     * 队列配置参数
//     */
//    private final QueueConfig queueConfig;
//
//    /**
//     * 构造方法
//     *
//     * @param config 队列配置参数，包含：
//     *               - 核心/最大线程数
//     *               - 队列容量
//     *               - 存活时间
//     *               - 最大重试次数
//     */
//    public TaskExecutor(QueueConfig config) {
//        this.queueConfig = config;
//        // 初始化单线程重试调度器
//        this.retryScheduler = Executors.newScheduledThreadPool(1);
//        // 创建优先级队列（容量可配置）
//        PriorityBlockingQueue<Runnable> queue = new PriorityBlockingQueue<>(
//                config.getQueueCapacity(),
//                // 优先级数值越大越优先
//                Comparator.comparing(
//                        runnable -> {
//                            if (runnable instanceof PriorityFutureTask priorityFutureTask) {
//                                return priorityFutureTask.getPrioritizedTask();
//                            }
//                            throw new IllegalArgumentException("Only PriorityFutureTask can be comparing.");
//                        }
//                ).reversed()
//        );
//        // 初始化线程池
//        this.executor = new PriorityThreadPoolExecutor(
//                config.getCorePoolSize(),
//                config.getMaxPoolSize(),
//                queueConfig.getKeepAliveTime(), queueConfig.getTimeUnit(),
//                queue,
//                new TaskThreadFactory());
//    }
//
//    /**
//     * 提交新任务到执行队列
//     *
//     * @param event   按钮事件（包含执行逻辑和优先级）
//     * @param success 成功回调（在UI线程执行）
//     * @param failure 失败回调（在UI线程执行）
//     * @return Future对象可用于跟踪任务状态
//     */
//    public Future<?> submitTask(ButtonEvent event,
//                                Runnable success,
//                                Runnable failure) {
//        // 包装为可优先执行的任务
//        PrioritizedTask task = new PrioritizedTask(() -> {
//            Label label = new Label("任务" + event.eventId() + "正在执行中..");
//            try {
//                AbstractApplication.updateRunningProgramList(label);
//                // 执行核心逻辑
//                event.execute();
//                // 执行成功回调
//                success.run();
//            } catch (Throwable throwable) {
//                handleFailure(event, throwable, success, failure);
//            } finally {
//                AbstractApplication.updateRunningProgramList(label);
//            }
//            // 设置任务优先级
//        }, event.priority().getValue());
//
//        return executor.submit(task);
//    }
//
//    /**
//     * 失败处理逻辑（私有方法）
//     */
//    private void handleFailure(ButtonEvent event, Throwable throwable,
//                               Runnable successCallback, Runnable failureCallback) {
//        if (shouldRetry(event, throwable)) {
//            resubmit(event, successCallback, failureCallback);
//        } else {
//            // 在UI线程执行失败回调
//            ComUtil.uiThreadRun(() -> {
//                failureCallback.run();
//                log.error("任务执行失败:{} - ", event.eventId(), throwable);
//            });
//        }
//    }
//
//    /**
//     * 判断是否需要重试（私有方法）
//     */
//    private boolean shouldRetry(ButtonEvent event, Throwable throwable) {
//        // 检查异常类型是否可重试
//        for (Class<?> exType : event.retryableExceptions()) {
//            if (exType.isInstance(throwable)) {
//                return event.getRetryCount() < queueConfig.getMaxRetryAttempts();
//            }
//        }
//        return false;
//    }
//
//    /**
//     * 调度重试任务（带指数退避）
//     */
//    private void resubmit(ButtonEvent event, Runnable successCallback, Runnable failureCallback) {
//        event.incrementRetryCount();
//        // 指数退避算法：2^retryCount 秒
//        long delay = (1L << event.getRetryCount()) * 1000;
//        // 使用独立调度器
//        retryScheduler.schedule(() -> {
//            log.info("重试任务 [ID:{}] 第{}次尝试", event.eventId(), event.getRetryCount());
//            submitTask(event, successCallback, failureCallback);
//        }, delay, TimeUnit.MILLISECONDS);
//    }
//
//    /**
//     * 获取当前队列大小
//     */
//    public int getQueueSize() {
//        return executor.getQueue().size();
//    }
//
//    /**
//     * 获取活跃线程数
//     */
//    public int getActiveCount() {
//        return executor.getActiveCount();
//    }
//
//    /**
//     * 优雅关闭执行器
//     *
//     * <p>关闭流程：
//     * 1. 停止接收新任务
//     * 2. 等待正在执行的任务完成
//     * 3. 中断空闲线程
//     */
//    public void shutdown() {
//        // 关闭主线程池
//        executor.shutdown();
//        // 关闭重试调度器
//        retryScheduler.shutdown();
//
//        try {
//            // 等待线程池终止（最多3秒）
//            if (!executor.awaitTermination(3, TimeUnit.SECONDS)) {
//                log.warn("强行关闭任务线程池");
//                executor.shutdownNow();
//            }
//        } catch (InterruptedException e) {
//            log.warn("强行关闭任务线程池");
//            executor.shutdownNow();
//            Thread.currentThread().interrupt();
//        }
//    }
//}
